package com.example.demo.module.repository.service;

import com.example.demo.common.entity.enums.RepositoryTypeEnum;
import com.example.demo.common.service.BaseService;
import com.example.demo.entity.pojo.repository.RepositoryPoJo;
import com.example.demo.entity.request.repository.RepositoryRequest;
import com.example.demo.module.repository.dto.TreeNode;

import java.util.List;

/**
 * RepositoryService.
 *
 * @author Mei Ruoxiao
 * @since 2020/9/11
 */
public interface RepositoryService extends BaseService<RepositoryPoJo> {
    /**
     * 新增仓库文件夹
     *
     * @param request   请求对象
     * @param companyId 企业ID
     * @return ID
     */
    long create(RepositoryRequest request, final long companyId);

    /**
     * 获取文件夹树
     *
     * @param type      仓库类型 0-材料 1-成品 2-废品
     * @param companyId 企业ID
     * @return TreeNode
     */
    TreeNode tree(final int type, final long companyId);

    /**
     * 根据名称获取文件夹
     *
     * @param parentId  父ID
     * @param name      文件夹名称
     * @param type      文件/文件夹类型 {@link RepositoryTypeEnum#value()}
     * @param companyId 企业ID
     * @return 该名称文件夹
     * @author Mei Ruoxiao
     * @since 2020/9/11
     */
    RepositoryPoJo getByName(String name, final long parentId, final int type, final long companyId);

    /**
     * 获取根文件夹
     *
     * @param type      文件/文件夹类型 {@link RepositoryTypeEnum#value()}
     * @param companyId 企业ID
     * @return 根文件夹
     * @author Mei Ruoxiao
     * @since 2020/9/11
     */
    RepositoryPoJo getRootFolder(final int type, final long companyId);


    /**
     * 获取父ID下的所有子文件夹
     *
     * @param companyId 企业ID
     * @param parentId  父ID
     * @return 该文件夹下的所有子文件夹列表（仅子一级）
     */
    List<RepositoryPoJo> listByParentId(final long parentId, final long companyId);

    /**
     * 修改仓库文件夹名
     *
     * @param id        文件夹ID
     * @param request   request
     * @param companyId 企业ID
     * @return true/false
     */
    boolean update(final long id, RepositoryRequest request, final long companyId);

    /**
     * 删除文件夹
     *
     * @param id        id
     * @param companyId 企业ID
     * @return true/false
     */
    boolean delete(final long id, final long companyId);

}
